package main

import (
	"crypto/md5"
	"encoding/json"
	"fmt"
	"gorm.io/gorm"
	"io"
	"io/ioutil"
	"mytest/util"
	"net/http"
	"sort"
	"strings"
	"time"
)

func main() {
	util.IsCompress = false
	base64CutImgStr, base64BgImgStr, imageId, imageRandX, imageRandY := util.CreateCode()
	fmt.Println(base64CutImgStr)
	fmt.Println("------")
	fmt.Println(base64BgImgStr)
	fmt.Println("------")

	fmt.Println(len(base64CutImgStr))
	fmt.Println("------")
	fmt.Println(len(base64BgImgStr))

	fmt.Println(imageId)
	fmt.Println(imageRandX)
	fmt.Println(imageRandY)
	return
	arr := []int{1, 2, 3, 4}
	for i, v := range arr {
		if v == 3 {
			arr[i] = 33
		}
	}
	fmt.Println(arr[:10])
	return
	url := "https://issue-game.cdqcwl.com/v1/issue/h5/youyougu1default/74d18d535a963302d040592e5a2c63a9/getRole"
	//url := "http://issue.hjygame.com/sdk/gamerole/aid/1295/gid/1351/"
	data := map[string]interface{}{
		"user_id":   577824,
		"server_id": 60001,
		"role_id":   52778705622342,
		"time":      time.Now().Unix(),
	}
	sign, err := SignData(data, "GE3TAOJVGMYDIOJW")
	fmt.Println("sign:", sign)
	if err != nil {
		fmt.Println(err)
		return
	}
	data["sign"] = sign
	senddata, err := json.Marshal(data)
	resp, err := http.Post(url, "application/json", strings.NewReader(string(senddata)))
	if err != nil || resp.StatusCode != 200 {
		fmt.Println(err)
		return
	}
	resB, _ := ioutil.ReadAll(resp.Body)
	fmt.Println(string(resB))
	var roleInfo struct {
		Status int    `json:"status"`
		Msg    string `json:"msg"`
		Data   struct {
			ServerId   string `json:"server_id"`
			ServerName string `json:"server_name"`
			RoleName   string `json:"role_name"`
			RoleId     string `json:"role_id"`
			RoleLevel  string `json:"role_level"`
			RolePower  string `json:"role_power"`
		} `json:"data"`
	}
	err = json.Unmarshal(resB, &roleInfo)
	if err != nil {
		fmt.Println(err)
		return
	}
	fmt.Println(roleInfo)
	return
}

type CheckRoleResp struct {
	Status int    `json:"status"`
	Msg    string `json:"msg"`
	Data   struct {
		ServerId   string `json:"server_id"`
		ServerName string `json:"server_name"`
		RoleName   string `json:"role_name"`
		RoleId     string `json:"role_id"`
		RoleLevel  string `json:"role_level"`
		RolePower  string `json:"role_power"`
	} `json:"data"`
}

// 'user_id'   :渠道提供的用户id
//	'server_id' :区服id
//	'role_id'   :角色id
//	'time'      :时间戳秒（10位）（5分钟之后请求超时）
//	'sign'	    :签名（字母正排序：role_id=3532897826898308&server_id=1680604&time=1710349641&user_id=233107&game_key=渠道提供的gameKey）

func SignData(data map[string]interface{}, gamekey string) (string, error) {
	keySlice := make([]string, 0)
	for k, _ := range data {
		keySlice = append(keySlice, k)
	}
	sort.Strings(keySlice)

	var originStr string
	for _, v := range keySlice {
		originStr += fmt.Sprintf("%v=%v&", v, data[v])
	}
	originStr += fmt.Sprintf("game_key=%v", gamekey)
	fmt.Println("originStr:", originStr)
	m := md5.New()
	_, err := io.WriteString(m, originStr)
	if err != nil {
		return "", err
	}
	arr := m.Sum(nil)
	return fmt.Sprintf("%x", arr), nil
}

type Result struct {
	TotalId  int
	TotalAge int
}

type User struct {
	gorm.Model
	Name string `json:"name"`
	Age  int    `json:"age"`
}

type Resource struct {
	SubSystemId  string `json:"subSystemId"`  // 子系统ID
	ChannelId    string `json:"channelId"`    // 通道ID
	ChannelName  string `json:"channelName"`  // 通道名称
	DeviceId     string `json:"deviceId"`     // 设备ID
	DeviceName   string `json:"deviceName"`   // 设备名称
	KeyPartId    string `json:"keyPartId"`    // 重点部位ID
	KeyPartName  string `json:"keyPartName"`  // 重点部位名称
	OrgId        string `json:"orgId"`        // 机构ID
	OrgName      string `json:"orgName"`      // 机构名称
	DepartmentId string `json:"departmentId"` // 部门Id
	Department   string `json:"department"`   // 部门名称
	CenterId     string `json:"centerId"`     // 监控中心ID
	CenterName   string `json:"centerName"`   // 监控中心名称
	Source       string `json:"source"`       // 流来源 1.报警  2.电视墙  3.客户端 4.级联
	ClientSrc    string `json:"clientSrc"`    // web、app等
	UserId       string `json:"userId"`       // 用户ID
	UserName     string `json:"userName"`     // 用户名称
	RoleId       string `json:"roleId"`       // 角色
	RoleName     string `json:"roleName"`     // 角色名称
	Name         string `json:"name"`         // 用户姓名
}

type BandwidthInfo struct {
	InStreamInfos     []string      `json:"inStreamInfos,omitempty"`     //输入流,解析的数据中InStreamInfo,OutStreamInfo只会存在一项
	InStreamInfoList  []*StreamInfo `json:"inStreamInfoList,omitempty"`  //输入流,解析的数据中InStreamInfo,OutStreamInfo只会存在一项
	OutStreamInfos    []string      `json:"outStreamInfos,omitempty"`    //输出流,解析的数据中InStreamInfo,OutStreamInfo只会存在一项
	OutStreamInfoList []*StreamInfo `json:"outStreamInfoList,omitempty"` //输出流,解析的数据中InStreamInfo,OutStreamInfo只会存在一项
	StartTime         string        `json:"startTime"`                   //发送时间
	TickTime          string        `json:"tickTime"`                    //发送时间
	Rate              string        `json:"rate"`                        //单位字节
	//ServerId       string        `json:"serverId"`
	//Interval       int           `json:"interval"`     //间隔时间暂定60秒
	//OwerCenterId   string        `json:"owerCenterId"` //本级中心ID
	//OpeType        string        `json:"opeType"`      // real,playBack
}

type StreamInfo struct {
	OutStreamInfo *Stream `json:"outStreamInfo,omitempty"`
	InStreamInfo  *Stream `json:"inStreamInfo,omitempty"`
	OwerCenterId  string  `json:"owerCenterId"`
	ServerId      string  `json:"serverId"`
	Time          int64   `json:"time"`
}

// Stream 流信息
type Stream struct {
	DevIp      string    `json:"devIp"`
	Port       int       `json:"port"`
	Channel    int       `json:"channel"`
	StreamType int       `json:"streamType"`
	ClientId   string    `json:"clientId"`
	Detail     *Resource `json:"detail"`
	CenterId   string    `json:"centerId"`
	Uuid       string    `json:"uuid"`
}
type Channel struct {
	Cid         int64      `json:"cid"`
	Time        int        `json:"time"`
	ChannelId   string     `json:"channelId"`
	ChannelName string     `json:"channelName"`
	DeviceId    string     `json:"deviceId"`
	DeviceName  string     `json:"deviceName"`
	KeyPartId   string     `json:"keyPartId"`
	KeyPartName string     `json:"keyPartName"`
	OrgId       string     `json:"orgId"`
	OrgName     string     `json:"orgName"`
	StartTime   string     `json:"startTime"`
	Rate        string     `json:"rate"`
	Watchers    []*Watcher `json:"watchers"`
}

type Watcher struct {
	UserName      string `json:"userName"`
	Name          string `json:"name"`
	Department    string `json:"department"`
	ClientSrc     string `json:"clientSrc"`
	ServerId      string `json:"serverId"`
	OutStreamInfo string `json:"outStreamInfo,omitempty"`
}

type StreamData struct {
	CenterName  string              `json:"centerName"`
	ChannelList map[string]*Channel `json:"channelList"`
}

func sortChannelList(channelList []*Channel) []*Channel {
	//进行升序 i < j
	sort.Slice(channelList, func(i, j int) bool {
		return channelList[i].Cid < channelList[j].Cid
	})
	fmt.Println("排序后-升序:")
	for _, item := range channelList {
		fmt.Printf("Channel: %+v\n", item)
	}
	fmt.Println("--------------------------------------------------------------------------------------------")
	//进行升序 i < j
	sort.Slice(channelList, func(i, j int) bool {
		return channelList[i].Time < channelList[j].Time
	})
	fmt.Println("排序后-升序:")
	for _, item := range channelList {
		fmt.Printf("Channel2: %+v\n", item)
	}
	return channelList
}
